package edu.pucsp.predatorprey.simulador.java.terreno.impl;

import edu.pucsp.predatorprey.simulador.java.criatura.AbstractCriatura;
import edu.pucsp.predatorprey.simulador.java.criatura.Predador;
import edu.pucsp.predatorprey.simulador.java.criatura.Presa;
import edu.pucsp.predatorprey.simulador.java.posicao.impl.Posicao;

public class ControleVida {

	public AbstractCriatura analisarMortes(AbstractCriatura[][] vizinhanca) {
		AbstractCriatura criaturaQueSeMoveu = vizinhanca[1][1];

		for (int x = 0; x < 3; x++) {
			for (int y = 0; y < 3; y++) {
				if (this.posicaoComCriatura(vizinhanca, x, y)) {
					AbstractCriatura outraCriatura = vizinhanca[x][y];
					if (criaturaQueSeMoveu.podeComer(outraCriatura)) {
						criaturaQueSeMoveu.comeu();
						return outraCriatura;
					} else if (outraCriatura.podeComer(criaturaQueSeMoveu)) {
						outraCriatura.comeu();
						return criaturaQueSeMoveu;
					}
				}
			}
		}
		if (criaturaQueSeMoveu.deveMorerCausasNaturais()) {
			return criaturaQueSeMoveu;
		}
		return null;
	}

	public AbstractCriatura analisarNascimentos(AbstractCriatura[][] vizinhanca, Posicao pos) {
		AbstractCriatura criaturaQueSeMoveu = vizinhanca[1][1];

		for (int x = 0; x < 3; x++) {
			for (int y = 0; y < 3; y++) {
				if (this.posicaoComCriatura(vizinhanca, x, y)) {
					AbstractCriatura outraCriatura = vizinhanca[x][y];
					if (criaturaQueSeMoveu.podeProcriar(outraCriatura)) {
						criaturaQueSeMoveu.procriou();
						outraCriatura.procriou();
						return this.novaCriatura(criaturaQueSeMoveu.isPredador());
					}
				}
			}
		}
		return null;
	}

	private boolean posicaoComCriatura(AbstractCriatura[][] vizinhanca, int x, int y) {
		return vizinhanca[x][y] != null && x != 1 && y != 1;
	}

	private AbstractCriatura novaCriatura(boolean predador) {
		return predador ? new Predador() : new Presa();
	}

}
